package services

import (
	"github.com/shopspring/decimal"
	"time"
)

// 应用服务层接口(不包含业务逻辑)

// 在 core/accounts/service.go 的init()函数里实例化
var IAccountService AccountService

// 对外获取暴露IAccountService的唯一方法
func GetAccountService() AccountService {
	return IAccountService
}

// 定义DTO
type AccountService interface {
	CreateAccount(dto AccountCreateDTO) (*AccountDTO, error) // 账户创建
	Transfer(dto AccountTransferDTO) (TransferStatus, error) // 转账
	StoreValue(dto AccountTransferDTO) (TransferStatus, error) // 储值
	GetEnvelopesAccountByUserId(userId string) *AccountDTO // 根据用户id查询红包账户信息
	GetAccount(accountNo string) *AccountDTO // 根据账户编号查询账户信息
}

// 账户创建
type AccountCreateDTO struct {
	UserId string `validate:"required"`
	Username string `validate:"required"`
	AccountName string `validate:"required"`
	AccountType int // 账户类型
	CurrencyCode string // 币种
	Amount decimal.Decimal `validate:"required"`
	// AccountNo系统自动生成
	// Balance等于Amount
	// Status有默认值
}

// 账户信息
type AccountDTO struct {
	AccountCreateDTO
	AccountNo string
	CreatedAt time.Time
	// 5.9新增字段
	Balance decimal.Decimal
	Status int
	UpdatedAt time.Time
}

// 账户交易参与者
type TradeParticipator struct {
	AccountNo string `validate:"required"`
	UserId string `validate:"required"`
	Username string `validate:"required"`
}

// 账户转账
type AccountTransferDTO struct {
	TradeNo string `validate:"required"` // 交易单号(系统生成)
	TradeBody TradeParticipator // 交易主体
	TradeTarget TradeParticipator // 交易目标
	Amount decimal.Decimal `validate:"required"` // 交易金额
	ChangeType ChangeType `validate:"required"`  // 交易类型
	ChangeFlag ChangeFlag `validate:"required"`  // 交易标识
	Desc string
	// 5.10新增该字段
	AmountStr string // 交易金额字符串
}

// 账户流水
type AccountLogDTO struct {
	LogNo           string          // 流水编号 全局不重复字符或数字，唯一性标识
	TradeNo         string          // 交易单号 全局不重复字符或数字，唯一性标识
	AccountNo       string          // 账户编号 账户ID
	TargetAccountNo string          // 目标账户编号 账户ID
	UserId          string          // 用户编号
	Username        string          // 用户名称
	TargetUserId    string          // 目标用户编号
	TargetUsername  string          // 目标用户名称
	Amount          decimal.Decimal // 交易金额,该交易涉及的金额
	Balance         decimal.Decimal // 交易后余额,该交易后的余额
	ChangeType      ChangeType      // 流水交易类型，0 创建账户，>0 为收入类型，<0 为支出类型
	ChangeFlag      ChangeFlag      // 交易变化标识：-1 出账 1为进账
	Status          int             // 交易状态：-1转账失败 0无效数据 1有效
	Decs            string          // 交易描述
	CreatedAt       time.Time       // 创建时间
}
